package edu.hebeu.adapters;

import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;

import java.util.List;

import edu.hebeu.R;
import edu.hebeu.entity.ListGoodsResponse;
import edu.hebeu.network.APIConfig;

public class CarAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<String[]> carData;
    private ListGoodsAdapter.OnItemClickListener onItemClickListener; // 某个条目被点击的监听器
    private OnTrashClickListener trashListener; // 点击垃圾箱的监听器
    private TextChangedListener textChangedListener; // 购买数量的文本框改变的监听器

    public CarAdapter(List<String[]> carData) {
        this.carData = carData;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = View.inflate(parent.getContext(), R.layout.item_car_list, null);
        return new InnerHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        ((InnerHolder) holder).setData(carData.get(position));
    }

    @Override
    public int getItemCount() {
        if (carData != null) {
            return carData.size();
        }
        return 0;
    }

    /**
     * 这个内部接口用来处理某个条目被点击的事件
     */
    public interface OnItemClickListener {

        /**
         * 这个方法用来处理某个Item被点击的事件
         * @param good
         */
        void onItemClick(ListGoodsResponse.Good good);
    }

    /**
     * 这个方法用来暴露给外部，来获取外部实现的OnTrashClickListener接口监听器
     * @param listener
     */
    public void setOnTrashClickListener(OnTrashClickListener listener) {
        this.trashListener = listener;
    }

    /**
     * 这个接口用来处理垃圾桶图标的点击监听
     */
    public interface OnTrashClickListener {
        void onTrashClick(String goodId);
    }

    /**
     * 这个方法用来暴漏给外部，获取外部实现的 TextChangedListener接口监听器
     */
    public void setTextChangedListener(TextChangedListener listener) {
        this.textChangedListener = listener;
    }

    /**
     * 这个接口用来处理文本框发生变化的监听
     */
    public interface TextChangedListener {
        void textChanged(String[] carItem, Integer accountMoney);
    }

    public class InnerHolder extends RecyclerView.ViewHolder {

        private String[] carItem;
        private ImageView iv_prod;
        private TextView tv_title;
        private ImageButton iv_trash;
        private TextView tv_money;
        private Button btn_add;
        private EditText et_buy_num;
        private Button btn_sub;

        public InnerHolder(@NonNull View itemView) {
            super(itemView);
            iv_prod = (ImageView) itemView.findViewById(R.id.iv_prod);
            tv_title = (TextView) itemView.findViewById(R.id.tv_title);
            iv_trash = (ImageButton) itemView.findViewById(R.id.iv_trash);
            tv_money = (TextView) itemView.findViewById(R.id.tv_money);
            btn_add = (Button) itemView.findViewById(R.id.btn_add);
            et_buy_num = (EditText) itemView.findViewById(R.id.et_buy_num);
            btn_sub = (Button) itemView.findViewById(R.id.btn_sub);

            // 设置监听事件
            initListeners();
        }

        public void setData(String[] carItem) {
            this.carItem = carItem;

            /*
            Glide加载图片时可以指定的参数，以实现在请求中、请求失败、请求为空时各显示的图片
             */
            RequestOptions requestOptions = new RequestOptions()
                    .placeholder(R.drawable.hold) // 正在请求图片时展示的图片
                    .error(R.drawable.error) // 如果请求失败时展示的图片(如果没有设置，还是展示placeholder的展位符)
                    .fallback(R.drawable.fallback) // 如果请求的url为null时展示的图片(如果没有设置，还是展示placeholder的占位符)
                    .override(100, 100); // 上述几种状态显示的占位符图片的大小
            /*
            使用Glide加载图片
             */
            Glide.with(itemView)
                    .load("http://150.158.212.186:3001" + carItem[6])
                    .apply(requestOptions) // 设置请求该url在各个状态时控件的展位图片
                    .into(iv_prod);
            tv_title.setText(carItem[1] + "——" + carItem[5]);
            tv_money.setText("￥" + carItem[4]);
            et_buy_num.setText(carItem[3]);
        }

        private void initListeners() {
            iv_trash.setOnClickListener(new View.OnClickListener() { // 垃圾图标被点击的处理事件
                @Override
                public void onClick(View v) {
                    if (trashListener != null) {
                        trashListener.onTrashClick(carItem[0]);
                    }
                }
            });
            btn_add.setOnClickListener(new View.OnClickListener() { // + 按钮被点击的处理事件
                @Override
                public void onClick(View v) {
                    if (Integer.parseInt(carItem[3]) < Integer.parseInt(carItem[2])) {
                        int tmp = Integer.parseInt(carItem[3]); // 获取当前的购买数量
                        tmp = tmp + 1; // 将当前的购买数量 +1
                        carItem[3] = String.valueOf(tmp); // 改变购买的数量值
                        et_buy_num.setText(carItem[3]); // 将更新后的值赋到文本框上
                    }
                }
            });
            btn_sub.setOnClickListener(new View.OnClickListener() { // - 按钮被点击的处理事件
                @Override
                public void onClick(View v) {
                    if (Integer.parseInt(carItem[3]) > 1) {
                        int tmp = Integer.parseInt(carItem[3]); // 获取当前的购买数量
                        tmp = tmp - 1; // 将当前的购买数量 -1
                        carItem[3] = String.valueOf(tmp); // 改变购买的数量值
                        et_buy_num.setText(carItem[3]); // 将更新后的值赋到文本框上
                    }
                }
            });
            et_buy_num.addTextChangedListener(new TextWatcher() { // 购买数量的文本被改变的监听
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
                @Override
                public void afterTextChanged(Editable s) {
                    String numStr = et_buy_num.getText().toString(); // 获取文本框的值
                    if (!numStr.equals("")) { // 如果文本框不为空
                        carItem[3] = numStr; // 将购买的数量更新为文本框的值
                        int accountMoney = accountMoney(); // 计算总金额
                        textChangedListener.textChanged(carItem, accountMoney); // 调用外部实现的接口方法
                    }
                }
            });
        }

        /**
         * 这个方法用来计算购物车的总计
         * @return
         */
        private int accountMoney() {
            int totalMoney = 0;
            for (String[] carItem : carData) {
                int itemMoney = Integer.parseInt(carItem[3]) * Integer.parseInt(carItem[4]); // 计算此商品的数量
                totalMoney += itemMoney; // 将该商品的数量汇总到总金额上
            }
            return totalMoney;
        }
    }

}
